Skip to content

Conversation

@gsoldatov
Copy link

@gsoldatov gsoldatov commented Nov 19, 2025

What do these changes do?

  • added RequestKey & ResponseKey classes, which enable static typing checks in corresponding classes with dict-like storages, similarly to AppKey;
  • moved common logic of key classes into a super-class;
  • added tests for new classes & updated docs;
  • fixed a few flake8 errors.

Are there changes in behavior for the user?

Users may now use RequestKey & ResponseKey in request & response objects, in addition to string keys.

Is it a substantial burden for the maintainers to support this?

Related issue number

This issue should close #11762.

Checklist

  • I think the code is well written
  • Unit tests for the changes exist
  • Documentation reflects the changes
  • If you provide code modification, please add yourself to CONTRIBUTORS.txt
    • The format is <Name> <Surname>.
    • Please keep alphabetical order, the file is sorted by names.
  • Add a new news fragment into the CHANGES/ folder
    • name it <issue_or_pr_num>.<type>.rst (e.g. 588.bugfix.rst)

    • if you don't have an issue number, change it to the pull request
      number after creating the PR

      • .bugfix: A bug fix for something the maintainers deemed an
        improper undesired behavior that got corrected to match
        pre-agreed expectations.
      • .feature: A new behavior, public APIs. That sort of stuff.
      • .deprecation: A declaration of future API removals and breaking
        changes in behavior.
      • .breaking: When something public is removed in a breaking way.
        Could be deprecated in an earlier release.
      • .doc: Notable updates to the documentation structure or build
        process.
      • .packaging: Notes for downstreams about unobvious side effects
        and tooling. Changes in the test invocation considerations and
        runtime assumptions.
      • .contrib: Stuff that affects the contributor experience. e.g.
        Running tests, building the docs, setting up the development
        environment.
      • .misc: Changes that are hard to assign to any of the above
        categories.
    • Make sure to use full sentences with correct case and punctuation,
      for example:

      Fixed issue with non-ascii contents in doctest text files
      -- by :user:`contributor-gh-handle`.

      Use the past tense or the present tense a non-imperative mood,
      referring to what's changed compared to the last released version
      of this project.

@codspeed-hq
Copy link

codspeed-hq bot commented Nov 19, 2025

CodSpeed Performance Report

Merging #11766 will not alter performance

Comparing gsoldatov:request_response_storage_typing (b3188c8) with master (72fadb8)

Summary

✅ 59 untouched

@psf-chronographer psf-chronographer bot added the bot:chronographer:provided There is a change note present in this PR label Nov 19, 2025
@gsoldatov
Copy link
Author

I believe this one's ready for review, or, at the very least, tests are passed locally.

Also, I didn't add warnings for string keys usage, since it'd be too spammy to raise them on a per-request basis.

@gsoldatov gsoldatov marked this pull request as ready for review November 20, 2025 19:18
Comment on lines +892 to +893

pass
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Docstring is enough.

Suggested change
pass

def __setitem__(self, key: str, value: Any) -> None: ...

def __setitem__(self, key: str | RequestKey[_T], value: Any) -> None:
self._state[key] = value
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should probably put the same warning in:

Suggested change
self._state[key] = value
if not isinstance(key, RequestKey):
warnings.warn(
"It is recommended to use web.RequestKey instances for keys.\n"
+ "https://docs.aiohttp.org/en/stable/web_advanced.html"
+ "#application-s-config",
category=NotAppKeyWarning,
stacklevel=2,
)
self._state[key] = value

We can probably just leave the warning as NotAppKeyWarning for backwards compatibility..

Comment on lines +539 to +549
This class should be used for the keys in :class:`Request` and
:class:`BaseRequest`. They provide a type-safe alternative to
`str` keys when checking your code with a type checker (e.g. mypy).
They also avoid name clashes with keys from different libraries etc.

:param name: A name to help with debugging. This should be the same as
the variable name (much like how :class:`typing.TypeVar`
is used).

:param t: The type that should be used for the value in the dict (e.g.
`str`, `Iterator[int]` etc.)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To keep maintenance simpler, we should probably do something like:

Suggested change
This class should be used for the keys in :class:`Request` and
:class:`BaseRequest`. They provide a type-safe alternative to
`str` keys when checking your code with a type checker (e.g. mypy).
They also avoid name clashes with keys from different libraries etc.
:param name: A name to help with debugging. This should be the same as
the variable name (much like how :class:`typing.TypeVar`
is used).
:param t: The type that should be used for the value in the dict (e.g.
`str`, `Iterator[int]` etc.)
Keys for use in :class:`Request`.
See :class:`AppKey` for more details.

@Dreamsorcerer Dreamsorcerer added the backport-3.14 Trigger automatic backporting to the 3.14 release branch by Patchback robot label Nov 21, 2025
@codecov
Copy link

codecov bot commented Nov 21, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.74%. Comparing base (72fadb8) to head (b3188c8).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##           master   #11766   +/-   ##
=======================================
  Coverage   98.74%   98.74%           
=======================================
  Files         127      127           
  Lines       43754    43826   +72     
  Branches     2328     2332    +4     
=======================================
+ Hits        43204    43276   +72     
  Misses        389      389           
  Partials      161      161           
Flag Coverage Δ
CI-GHA 98.60% <95.78%> (-0.01%) ⬇️
OS-Linux 98.34% <95.78%> (+<0.01%) ⬆️
OS-Windows 96.68% <95.78%> (-0.02%) ⬇️
OS-macOS 97.56% <95.78%> (-0.01%) ⬇️
Py-3.10.11 97.10% <91.57%> (-0.02%) ⬇️
Py-3.10.19 97.60% <91.57%> (-0.02%) ⬇️
Py-3.11.14 97.80% <91.57%> (-0.02%) ⬇️
Py-3.11.9 97.31% <91.57%> (-0.01%) ⬇️
Py-3.12.10 97.41% <91.57%> (-0.03%) ⬇️
Py-3.12.12 97.90% <91.57%> (-0.02%) ⬇️
Py-3.13.9 98.16% <91.57%> (-0.01%) ⬇️
Py-3.14.0 98.11% <91.57%> (-0.02%) ⬇️
Py-3.14.0t 97.18% <91.57%> (-0.02%) ⬇️
Py-pypy3.11.13-7.3.20 97.40% <91.57%> (-0.02%) ⬇️
VM-macos 97.56% <95.78%> (-0.01%) ⬇️
VM-ubuntu 98.34% <95.78%> (+<0.01%) ⬆️
VM-windows 96.68% <95.78%> (-0.02%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-3.14 Trigger automatic backporting to the 3.14 release branch by Patchback robot bot:chronographer:provided There is a change note present in this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Typing support for Request & Response storages

2 participants